/*
 *-----------------------------------------------------------------------
 *
 * pgxc_ctl_bash.c
 *
 *    Bash script body for Postrgres-XC configuration and operation tool.
 *
 * Copyright (c) 2013 Postgres-XC Development Group
 *
 *------------------------------------------------------------------------
 *
 * This file was created by make_signature utility when pgxc_ctl was built.
 *
 * pgxc_ctl uses this bash script to configure postgres-xc and read
 * configuration.
 *
 * This provides users very flexible way to configure their own
 * postgres-xc cluster.  For example, by using extra variables and script,
 * you can save most of your specific hours typing same (or similar)
 * variable values again and again.
 */

#include <stddef.h>

/*
 * Bash script to read pgxc_ctl configuration parameters and write
 * back to itself.
 *
 * This part is written to pgxc_ctl work directory and reads
 * configuration file, which is also written in bash script.
 */

char* pgxc_ctl_bash_script[] = {"#!/bin/bash",
    "# Common variables ######################################################################",
    "xc_prompt='PGXC$ '",
    "interactive=n",
    "verbose=n",
    "progname=$0",
    "",
    "bin=pgxc_ctl		# Just in case.  Never touch this",
    "logfile=none",
    "",
    "#===========================================================",
    "#",
    "# Extract parsed configuration values",
    "#",
    "#===========================================================",
    "",
    "# $1 is variable name of the array to print",
    "function print_array",
    "{",
    "	echo -n $1 \" \"",
    "	eval echo '$'{$1[@]}",
    "}",
    "",
    "",
    "function print_values",
    "{",
    "	local i",
    "	declare -i i",
    "	local el",
    "",
    "	# Install Directory",
    "	echo pgxcInstallDir $pgxcInstallDir",
    "",
    "	# Overall",
    "	echo pgxcOwner $pgxcOwner",
    "	echo pgxcUser $pgxcUser",
    "	echo tmpDir $tmpDir",
    "	echo localTmpDir $localTmpDir",
    "	echo configBackup $configBackup",
    "	echo configBackupHost $configBackupHost",
    "	echo configBackupDir $configBackupDir",
    "	echo configBackupFile $configBackupFile",
    "",
    "	# GTM overall",
    "	echo gtmName $gtmName",
    "",
    "	# GTM master",
    "	echo gtmMasterServer $gtmMasterServer",
    "	echo gtmMasterPort $gtmMasterPort",
    "	echo gtmMasterDir $gtmMasterDir",
    "	echo gtmExtraConfig $gtmExtraConfig",
    "	echo gtmMasterSpecificExtraConfig $gtmMasterSpecificExtraConfig",
    "",
    "	# GTM slave",
    "	echo gtmSlave $gtmSlave",
    "	echo gtmSlaveServer $gtmSlaveServer",
    "	echo gtmSlavePort $gtmSlavePort",
    "	echo gtmSlaveDir $gtmSlaveDir",
    "	echo gtmSlaveSpecificExtraConfig $gtmSlaveSpecificExtraConfig",
    "",
    "	# GTM Proxy",
    "	echo gtmProxy $gtmProxy",
    "	print_array gtmProxyNames",
    "	print_array gtmProxyServers",
    "	print_array gtmProxyPorts",
    "	print_array gtmProxyDirs",
    "	echo gtmPxyExtraConfig $gtmPxyExtraConfig",
    "	print_array gtmPxySpecificExtraConfig",
    "",
    "	# Coordinators overall",
    "	print_array coordNames",
    "	print_array coordPorts",
    "	print_array poolerPorts",
    "	print_array coordPgHbaEntries",
    "",
    "	# Coordinators master",
    "	print_array coordMasterServers",
    "	print_array coordMasterDirs",
    "	print_array coordMaxWALSenders",
    "",
    "	# Coordinators slave",
    "	echo coordSlave $coordSlave",
    "	echo coordSlaveSync $coordSlaveSync",
    "	print_array coordSlaveServers",
    "	print_array coordSlaveDirs",
    "	print_array coordArchLogDirs",
    "",
    "	# Coordinator Configuration files",
    "	echo coordExtraConfig $coordExtraConfig",
    "	print_array coordSpecificExtraConfig",
    "	echo coordExtraPgHba $coordExtraPgHba",
    "	print_array coordSpecificExtraPgHba",
    "",
    "	# Coordinator Additional Slaves",
    "	echo coordAdditionalSlaves $coordAdditionalSlaves",
    "	if [ \"$coordAdditionalSlaves\" == \"y\" ]; then",
    "		print_array coordAdditionalSlaveSet",
    "		for ((i=0; i<${#coordAdditionalSlaveSet[@]}; i++)); do",
    "			el=${coordAdditionalSlaveSet[$i]}",
    "			echo -n ${el}_Sync \" \"",
    "			eval echo '$'\"$el\"_Sync",
    "			print_array ${el}_Servers",
    "			print_array ${el}_Dirs",
    "			print_array ${el}_ArchLogDirs",
    "		done",
    "	fi",
    "",
    "	# Datanodes overall",
    "	echo primaryDatanode $primaryDatanode",
    "	print_array datanodeNames",
    "	print_array datanodePorts",
    "	print_array datanodePgHbaEntries",
    "	",
    "	# Datanodes masters",
    "	print_array datanodeMasterServers",
    "	print_array datanodeMasterDirs",
    "	print_array datanodeMaxWALSenders",
    "	",
    "	# Datanodes slaves",
    "	echo datanodeSlave $datanodeSlave",
    "	echo datanodeSlaveSync $datanodeSlaveSync",
    "	print_array datanodeSlaveServers",
    "	print_array datanodeSlaveDirs",
    "	print_array datanodeArchLogDirs",
    "",
    "	# Datanode configuration files",
    "	echo datanodeExtraConfig $datanodeExtraConfig",
    "	print_array datanodeSpecificExtraConfig",
    "	echo datanodeExtraPgHba $datanodeExtraPgHba",
    "	print_array datanodeSpecificExtraPgHba",
    "",
    "	# Datanodes additional slaves",
    "	echo datanodeAdditionalSlaves $datanodeAdditionalSlaves",
    "	if [ \"$datanodeAdditionalSlaves\" == \"y\" ]; then",
    "		print_array datanodeAdditionalSlaveSet",
    "		for ((i=0; i<${#datanodeAdditionalSlaveSet[@]}; i++)); do",
    "			el=${datanodeAdditionalSlaveSet[$i]}",
    "			echo -n ${el}_Sync \" \"",
    "			eval echo '$'\"$el\"_Sync",
    "			print_array ${el}_Servers",
    "			print_array ${el}_Dirs",
    "			print_array ${el}_ArchLogDirs",
    "		done",
    "	fi",
    "	",
    "	# WAL Archives",
    "	echo walArchive $walArchive",
    "	print_array walArchiveSet",
    "	if [ \"$walArchive\" == \"y\" ]; then",
    "		for ((i=0; i<${#walArchvieSet[@]}; i++)); do",
    "			print_array ${el}_source",
    "			echo -n ${el}_host",
    "			eval echo '$'\"$el\"_host",
    "			echo -n ${el}_backupdir",
    "			eval echo '$'\"$el\"_backupdir",
    "		done",
    "	fi",
    "}",
    "",
    "",
    "",
    "#============================================================",
    "#",
    "# Common functions",
    "#",
    "#============================================================",
    "",
    "# Optionally $1 will be $PGXC_CTL_HOME settings.",
    "function set_home",
    "{",
    "	if [ $# > 1 ]; then",
    "		echo \"Invalid set_home function call\"",
    "		return 1",
    "	fi",
    "	if [ $# == 1 ]; then",
    "		if [ -d $1 ]; then",
    "			pgxc_ctl_home=$1",
    "		else",
    "			eecho \"set_home: $1 is not a directory.\"",
    "			return 1",
    "		fi",
    "	elif [ $PGXC_CTL_HOME != \"\" ]; then",
    "		if [ -d $PGXC_CTL_HOME ]; then",
    "			pgxc_ctl_home=$PGXC_CTL_HOME",
    "		else",
    "			eecho \"set_home: env PGXC_CTL_HOME($PGXC_CTL_HOME) is not a directory.\"",
    "			return 1;",
    "		fi",
    "	fi",
    "	cd $pgxc_ctl_home;",
    "}",
    "",
    "###############################################################################",
    "#",
    "#   EXECUTING SECTION",
    "#",
    "###############################################################################",
    "",
    "#=======================================================",
    "# Things to be done at first",
    "#=======================================================",
    "",
    "# Handle options",
    "progname=$0",
    "moretodo=y",
    "cmd_with_log=null",
    "#set_home",
    "if [ -f $pgxc_ctl_home/.pgxc_ctl_rc ]; then",
    "	source $pgxc_ctl_home/.pgxc_ctl_rc",
    "fi",
    "",
    "configFile=\"\"",
    "",
    "while [ $moretodo == y ]; do",
    "	if [ $# -gt 0 ]; then",
    "		case $1 in",
    "			-v )",
    "				shift;",
    "				verbose=y;",
    "				continue;;",
    "			--verbose )",
    "				shift;",
    "				verbose=y;",
    "				continue;;",
    "			--silent )",
    "				verbose=n;",
    "				continue;;",
    "			-d ) # debug option",
    "				shift;",
    "				DEBUG=y;",
    "				continue;;",
    "			--debug )",
    "				shift;",
    "				DEBUG=y;",
    "				continue;;",
    "			-c ) # Configuraton file",
    "				shift;",
    "				if [ $# -le 0 ]; then",
    "					echo ERROR: no -c option value found",
    "					exit 1",
    "				else",
    "					configFile=$1",
    "					shift",
    "				fi;",
    "				continue;;",
    "			--configuration ) # Configuraion file",
    "				shift;",
    "				if [ $# -le 0 ]; then",
    "					echo ERROR: no --configuration option value found",
    "					exit 1",
    "				else",
    "					configFile=$1",
    "					shift",
    "				fi;",
    "				continue;;",
    "			--home ) # PGXC_CTL_HOME",
    "				shift;",
    "				if [ $# -le 0 ]; then",
    "					echo ERROR: no pgxc_ctl_home specified",
    "					exit 1",
    "				else",
    "					pgxc_ctl_home=$1",
    "					cd $pgxc_ctl_home",
    "					shift",
    "				fi;",
    "				continue;;",
    "			--signature ) # Check signature",
    "				shift;",
    "				if [ $# -le 0 ]; then",
    "					echo ERROR: Signature does not match",
    "					exit 1",
    "				fi",
    "				if [ \"$1\" != \"$signature\" ]; then",
    "					echo ERROR: Signature does not match",
    "					exit 1",
    "				fi",
    "				shift",
    "				continue;;",
    "			* )",
    "				moretodo=n",
    "				continue;;",
    "		esac",
    "	else",
    "		moretodo=n",
    "	fi",
    "done",
    "",
    "echo $signature",
    "# Read configuration file --> Should be activated only when debug option is off",
    "",
    "if [ -f $pgxc_ctl_home/pgxc_ctl_rc ]; then",
    "	source $pgxc_ctl_home/pgxc_ctl_rc",
    "fi",
    "",
    "if [ \"$configFile\" != \"\" ] && [ -f \"$configFile\" ]; then",
    "	source $configFile",
    "fi",
    "# Log option can be overriden by command-line option",
    "",
    "print_values",
    "",
    "",
    NULL};

/*
 * Prototype of pgxc_ctl configuration file.
 *
 * It should be self descripting.   Can be extracted to your pgxc_ctl
 * work directory with 'prepare config' command.
 */

char* pgxc_ctl_conf_prototype[] = {"#!/bin/bash",
    "#",
    "# Postgres-XC Configuration file for pgxc_ctl utility. ",
    "#",
    "# Configuration file can be specified as -c option from pgxc_ctl command.   Default is",
    "# $PGXC_CTL_HOME/pgxc_ctl.org.",
    "#",
    "# This is bash script so you can make any addition for your convenience to configure",
    "# your Postgres-XC cluster.",
    "#",
    "# Please understand that pgxc_ctl provides only a subset of configuration which pgxc_ctl",
    "# provide.  Here's several several assumptions/restrictions pgxc_ctl depends on.",
    "#",
    "# 1) All the resources of pgxc nodes has to be owned by the same user.   Same user means",
    "#    user with the same user name.  User ID may be different from server to server.",
    "#    This must be specified as a variable $pgxcOwner.",
    "#",
    "# 2) All the servers must be reacheable via ssh without password.   It is highly recommended",
    "#    to setup key-based authentication among all the servers.",
    "#",
    "# 3) All the databases in coordinator/datanode has at least one same system admin.  Pgxc_ctl",
    "#    uses this user to connect to coordinators and datanodes.   Again, no password should",
    "#    be used to connect.  You have many options to do this, pg_hba.conf, pg_ident.conf and",
    "#    others.  Pgxc_ctl provides a way to configure pg_hba.conf but not pg_ident.conf.   This",
    "#    will be implemented in the later releases.",
    "#",
    "# 4) Gtm master and slave can have different port to listen, while coordinator and datanode",
    "#    slave should be assigned the same port number as master.",
    "#",
    "# 5) Port nuber of a coordinator slave must be the same as its master.",
    "#",
    "# 6) Master and slave are connected using synchronous replication.  Asynchronous replication",
    "#    have slight (almost none) chance to bring total cluster into inconsistent state.",
    "#    This chance is very low and may be negligible.  Support of asynchronous replication",
    "#    may be supported in the later release.",
    "#",
    "# 7) Each coordinator and datanode can have only one slave each.  Cascaded replication and",
    "#    multiple slave are not supported in the current pgxc_ctl.",
    "#",
    "# 8) Killing nodes may end up with IPC resource leak, such as semafor and shared memory.",
    "#    Only listening port (socket) will be cleaned with clean command.",
    "#",
    "# 9) Backup and restore are not supported in pgxc_ctl at present.   This is a big task and",
    "#    may need considerable resource.",
    "#",
    "#========================================================================================",
    "#",
    "#",
    "# pgxcInstallDir variable is needed if you invoke \"deploy\" command from pgxc_ctl utility.",
    "# If don't you don't need this variable.",
    "pgxcInstallDir=$HOME/pgxc",
    "#---- OVERALL -----------------------------------------------------------------------------",
    "#",
    "pgxcOwner=koichi		# owner of the Postgres-XC databaseo cluster.  Here, we use this",
    "						# both as linus user and database user.  This must be",
    "						# the system admin of each coordinator and datanode.",
    "pgxcUser=$pgxcOwner		# OS user of Postgres-XC owner",
    "",
    "tmpDir=/tmp					# temporary dir used in XC servers",
    "localTmpDir=$tmpDir			# temporary dir used here locally",
    "",
    "configBackup=n					# If you want config file backup, specify y to this value.",
    "configBackupHost=pgxc-linker	# host to backup config file",
    "configBackupDir=$HOME/pgxc		# Backup directory",
    "configBackupFile=pgxc_ctl.bak	# Backup file name --> Need to synchronize when original changed.",
    "",
    "#---- GTM ------------------------------------------------------------------------------------",
    "",
    "# GTM is mandatory.  You must have at least (and only) one GTM master in your Postgres-XC cluster.",
    "# If GTM crashes and you need to reconfigure it, you can do it by pgxc_update_gtm command to update",
    "# GTM master with others.   Of course, we provide pgxc_remove_gtm command to remove it.  This command",
    "# will not stop the current GTM.  It is up to the operator.",
    "",
    "#---- Overall -------",
    "gtmName=gtm",
    "",
    "#---- GTM Master -----------------------------------------------",
    "",
    "#---- Overall ----",
    "gtmMasterServer=node13",
    "gtmMasterPort=20001",
    "gtmMasterDir=$HOME/pgxc/nodes/gtm",
    "",
    "#---- Configuration ---",
    "gtmExtraConfig=none			# Will be added gtm.conf for both Master and Slave (done at initilization only)",
    "gtmMasterSpecificExtraConfig=none	# Will be added to Master's gtm.conf (done at initialization only)",
    "",
    "#---- GTM Slave -----------------------------------------------",
    "",
    "# Because GTM is a key component to maintain database consistency, you may want to configure GTM slave",
    "# for backup.",
    "",
    "#---- Overall ------",
    "gtmSlave=y					# Specify y if you configure GTM Slave.   Otherwise, GTM slave will not be configured "
    "and",
    "							# all the following variables will be reset.",
    "gtmSlaveServer=node12		# value none means GTM slave is not available.  Give none if you don't configure GTM "
    "Slave.",
    "gtmSlavePort=20001			# Not used if you don't configure GTM slave.",
    "gtmSlaveDir=$HOME/pgxc/nodes/gtm	# Not used if you don't configure GTM slave.",
    "# Please note that when you have GTM failover, then there will be no slave available until you configure the "
    "slave",
    "# again. (pgxc_add_gtm_slave function will handle it)",
    "",
    "#---- Configuration ----",
    "gtmSlaveSpecificExtraConfig=none # Will be added to Slave's gtm.conf (done at initialization only)",
    "",
    "#---- GTM Proxy "
    "-------------------------------------------------------------------------------------------------------",
    "# GTM proxy will be selected based upon which server each component runs on.",
    "# When fails over to the slave, the slave inherits its master's gtm proxy.  It should be",
    "# reconfigured based upon the new location.",
    "#",
    "# To do so, slave should be restarted.   So pg_ctl promote -> (edit postgresql.conf and recovery.conf) -> pg_ctl "
    "restart",
    "#",
    "# You don't have to configure GTM Proxy if you dont' configure GTM slave or you are happy if every component "
    "connects",
    "# to GTM Master directly.  If you configure GTL slave, you must configure GTM proxy too.",
    "",
    "#---- Shortcuts ------",
    "gtmProxyDir=$HOME/pgxc/nodes/gtm_pxy",
    "",
    "#---- Overall -------",
    "gtmProxy=y				# Specify y if you conifugre at least one GTM proxy.   You may not configure gtm proxies",
    "						# only when you dont' configure GTM slaves.",
    "						# If you specify this value not to y, the following parameters will be set to default "
    "empty values.",
    "						# If we find there're no valid Proxy server names (means, every servers are specified",
    "						# as none), then gtmProxy value will be set to \"n\" and all the entries will be set to",
    "						# empty values.",
    "gtmProxyNames=(gtm_pxy1 gtm_pxy2 gtm_pxy3 gtm_pxy4)	# No used if it is not configured",
    "gtmProxyServers=(node06 node07 node08 node09)			# Specify none if you dont' configure it.",
    "gtmProxyPorts=(20001 20001 20001 20001)				# Not used if it is not configured.",
    "gtmProxyDirs=($gtmProxyDir $gtmProxyDir $gtmProxyDir $gtmProxyDir)	# Not used if it is not configured.",
    "",
    "#---- Configuration ----",
    "gtmPxyExtraConfig=none		# Extra configuration parameter for gtm_proxy.  Coordinator section has an example.",
    "gtmPxySpecificExtraConfig=(none none none none)",
    "",
    "#---- Coordinators "
    "----------------------------------------------------------------------------------------------------",
    "",
    "#---- shortcuts ----------",
    "coordMasterDir=$HOME/pgxc/nodes/coord",
    "coordSlaveDir=$HOME/pgxc/nodes/coord_slave",
    "coordArchLogDir=$HOME/pgxc/nodes/coord_archlog",
    "",
    "#---- Overall ------------",
    "coordNames=(coord1 coord2 coord3 coord4)		# Master and slave use the same name",
    "coordPorts=(20004 20005 20004 20005)			# Master and slave use the same port",
    "poolerPorts=(20010 20011 20010 20011)			# Master and slave use the same pooler port",
    "coordPgHbaEntries=(192.168.1.0/24)				# Assumes that all the coordinator (master/slave) accepts",
    "												# the same connection",
    "												# This entry allows only $pgxcOwner to connect.",
    "												# If you'd like to setup another connection, you should",
    "												# supply these entries through files specified below.",
    "# Note: The above parameter is extracted as \"host all all 0.0.0.0/0 trust\".   If you don't want",
    "# such setups, specify the value () to this variable and suplly what you want using coordExtraPgHba",
    "# and/or coordSpecificExtraPgHba variables.",
    "",
    "#---- Master -------------",
    "coordMasterServers=(node06 node07 node08 node09)		# none means this master is not available",
    "coordMasterDirs=($coordMasterDir $coordMasterDir $coordMasterDir $coordMasterDir)",
    "coordMaxWALsernder=5	# max_wal_senders: needed to configure slave. If zero value is specified,",
    "						# it is expected to supply this parameter explicitly by external files",
    "						# specified in the following.	If you don't configure slaves, leave this value to zero.",
    "coordMaxWALSenders=($coordMaxWALsernder $coordMaxWALsernder $coordMaxWALsernder $coordMaxWALsernder)",
    "						# max_wal_senders configuration for each coordinator.",
    "",
    "#---- Slave -------------",
    "coordSlave=y			# Specify y if you configure at least one coordiantor slave.  Otherwise, the following",
    "						# configuration parameters will be set to empty values.",
    "						# If no effective server names are found (that is, every servers are specified as none),",
    "						# then coordSlave value will be set to n and all the following values will be set to",
    "						# empty values.",
    "coordSlaveSync=y		# Specify to connect with synchronized mode.",
    "coordSlaveServers=(node07 node08 node09 node06)			# none means this slave is not available",
    "coordSlaveDirs=($coordSlaveDir $coordSlaveDir $coordSlaveDir $coordSlaveDir)",
    "coordArchLogDirs=($coordArchLogDir $coordArchLogDir $coordArchLogDir $coordArchLogDir)",
    "",
    "#---- Configuration files---",
    "# Need these when you'd like setup specific non-default configuration ",
    "# These files will go to corresponding files for the master.",
    "# You may supply your bash script to setup extra config lines and extra pg_hba.conf entries ",
    "# Or you may supply these files manually.",
    "coordExtraConfig=coordExtraConfig	# Extra configuration file for coordinators.  ",
    "						# This file will be added to all the coordinators'",
    "						# postgresql.conf",
    "# Pleae note that the following sets up minimum parameters which you may want to change.",
    "# You can put your postgresql.conf lines here.",
    "cat > $coordExtraConfig <<EOF",
    "#================================================",
    "# Added to all the coordinator postgresql.conf",
    "# Original: $coordExtraConfig",
    "log_destination = 'stderr'",
    "logging_collector = on",
    "log_directory = 'pg_log'",
    "listen_addresses = '*'",
    "max_connections = 100",
    "EOF",
    "",
    "# Additional Configuration file for specific coordinator master.",
    "# You can define each setting by similar means as above.",
    "coordSpecificExtraConfig=(none none none none)",
    "coordExtraPgHba=none	# Extra entry for pg_hba.conf.  This file will be added to all the coordinators' "
    "pg_hba.conf",
    "coordSpecificExtraPgHba=(none none none none)",
    "",
    "#----- Additional Slaves -----",
    "#",
    "# Please note that this section is just a suggestion how we extend the configuration for",
    "# multiple and cascaded replication.   They're not used in the current version.",
    "#",
    "coordAdditionalSlaves=n		# Additional slave can be specified as follows: where you",
    "coordAdditionalSlaveSet=(cad1)		# Each specifies set of slaves.   This case, two set of slaves are",
    "											# configured",
    "cad1_Sync=n		  		# All the slaves at \"cad1\" are connected with asynchronous mode.",
    "							# If not, specify \"y\"",
    "							# The following lines specifies detailed configuration for each",
    "							# slave tag, cad1.  You can define cad2 similarly.",
    "cad1_Servers=(node08 node09 node06 node07)	# Hosts",
    "cad1_dir=$HOME/pgxc/nodes/coord_slave_cad1",
    "cad1_Dirs=($cad1_dir $cad1_dir $cad1_dir $cad1_dir)",
    "cad1_ArchLogDir=$HOME/pgxc/nodes/coord_archlog_cad1",
    "cad1_ArchLogDirs=($cad1_ArchLogDir $cad1_ArchLogDir $cad1_ArchLogDir $cad1_ArchLogDir)",
    "",
    "",
    "#---- Datanodes "
    "-------------------------------------------------------------------------------------------------------",
    "",
    "#---- Shortcuts --------------",
    "datanodeMasterDir=$HOME/pgxc/nodes/dn_master",
    "datanodeSlaveDir=$HOME/pgxc/nodes/dn_slave",
    "datanodeArchLogDir=$HOME/pgxc/nodes/datanode_archlog",
    "",
    "#---- Overall ---------------",
    "#primaryDatanode=datanode1				# Primary Node.",
    "# At present, xc has a priblem to issue ALTER NODE against the primay node.  Until it is fixed, the test will be "
    "done",
    "# without this feature.",
    "primaryDatanode=datanode1				# Primary Node.",
    "datanodeNames=(datanode1 datanode2 datanode3 datanode4)",
    "datanodePorts=(20008 20009 20008 20009)	# Master and slave use the same port!",
    "datanodePgHbaEntries=(192.168.1.0/24)	# Assumes that all the coordinator (master/slave) accepts",
    "										# the same connection",
    "										# This list sets up pg_hba.conf for $pgxcOwner user.",
    "										# If you'd like to setup other entries, supply them",
    "										# through extra configuration files specified below.",
    "# Note: The above parameter is extracted as \"host all all 0.0.0.0/0 trust\".   If you don't want",
    "# such setups, specify the value () to this variable and suplly what you want using datanodeExtraPgHba",
    "# and/or datanodeSpecificExtraPgHba variables.",
    "",
    "#---- Master ----------------",
    "datanodeMasterServers=(node06 node07 node08 node09)	# none means this master is not available.",
    "													# This means that there should be the master but is down.",
    "													# The cluster is not operational until the master is",
    "													# recovered and ready to run.	",
    "datanodeMasterDirs=($datanodeMasterDir $datanodeMasterDir $datanodeMasterDir $datanodeMasterDir)",
    "datanodeMaxWalSender=5								# max_wal_senders: needed to configure slave. If zero value "
    "is ",
    "													# specified, it is expected this parameter is explicitly "
    "supplied",
    "													# by external configuration files.",
    "													# If you don't configure slaves, leave this value zero.",
    "datanodeMaxWALSenders=($datanodeMaxWalSender $datanodeMaxWalSender $datanodeMaxWalSender $datanodeMaxWalSender)",
    "						# max_wal_senders configuration for each datanode",
    "",
    "#---- Slave -----------------",
    "datanodeSlave=y			# Specify y if you configure at least one coordiantor slave.  Otherwise, the following",
    "						# configuration parameters will be set to empty values.",
    "						# If no effective server names are found (that is, every servers are specified as none),",
    "						# then datanodeSlave value will be set to n and all the following values will be set to",
    "						# empty values.",
    "datanodeSlaveServers=(node07 node08 node09 node06)	# value none means this slave is not available",
    "datanodeSlaveSync=y		# If datanode slave is connected in synchronized mode",
    "datanodeSlaveDirs=($datanodeSlaveDir $datanodeSlaveDir $datanodeSlaveDir $datanodeSlaveDir)",
    "datanodeArchLogDirs=( $datanodeArchLogDir $datanodeArchLogDir $datanodeArchLogDir $datanodeArchLogDir )",
    "",
    "# ---- Configuration files ---",
    "# You may supply your bash script to setup extra config lines and extra pg_hba.conf entries here.",
    "# These files will go to corresponding files for the master.",
    "# Or you may supply these files manually.",
    "datanodeExtraConfig=none	# Extra configuration file for datanodes.  This file will be added to all the ",
    "							# datanodes' postgresql.conf",
    "datanodeSpecificExtraConfig=(none none none none)",
    "datanodeExtraPgHba=none		# Extra entry for pg_hba.conf.  This file will be added to all the datanodes' "
    "postgresql.conf",
    "datanodeSpecificExtraPgHba=(none none none none)",
    "",
    "#----- Additional Slaves -----",
    "datanodeAdditionalSlaves=n	# Additional slave can be specified as follows: where you",
    "# datanodeAdditionalSlaveSet=(dad1 dad2)		# Each specifies set of slaves.   This case, two set of slaves are",
    "											# configured",
    "# dad1_Sync=n		  		# All the slaves at \"cad1\" are connected with asynchronous mode.",
    "							# If not, specify \"y\"",
    "							# The following lines specifies detailed configuration for each",
    "							# slave tag, cad1.  You can define cad2 similarly.",
    "# dad1_Servers=(node08 node09 node06 node07)	# Hosts",
    "# dad1_dir=$HOME/pgxc/nodes/coord_slave_cad1",
    "# dad1_Dirs=($cad1_dir $cad1_dir $cad1_dir $cad1_dir)",
    "# dad1_ArchLogDir=$HOME/pgxc/nodes/coord_archlog_cad1",
    "# dad1_ArchLogDirs=($cad1_ArchLogDir $cad1_ArchLogDir $cad1_ArchLogDir $cad1_ArchLogDir)",
    "",
    "#---- WAL archives "
    "-------------------------------------------------------------------------------------------------",
    "walArchive=n	# If you'd like to configure WAL archive, edit this section.",
    "				# Pgxc_ctl assumes that if you configure WAL archive, you configure it",
    "				# for all the coordinators and datanodes.",
    "				# Default is \"no\".   Please specify \"y\" here to turn it on.",
    "#",
    "#		End of Configuration Section",
    "#",
    "#================================================================================================================="
    "=========",
    "",
    "#================================================================================================================="
    "=======",
    "# The following is for extension.  Just demonstrate how to write such extension.  There's no code",
    "# which takes care of them so please ignore the following lines.  They are simply ignored by pgxc_ctl.",
    "# No side effects.",
    "#=============<< Beginning of future extension demonistration >> "
    "========================================================",
    "# You can setup more than one backup set for various purposes, such as disaster recovery.",
    "walArchiveSet=(war1 war2)",
    "war1_source=(master)	# you can specify master, slave or ano other additional slaves as a source of WAL archive.",
    "					# Default is the master",
    "wal1_source=(slave)",
    "wal1_source=(additiona_coordinator_slave_set additional_datanode_slave_set)",
    "war1_host=node10	# All the nodes are backed up at the same host for a given archive set",
    "war1_backupdir=$HOME/pgxc/backup_war1",
    "wal2_source=(master)",
    "war2_host=node11",
    "war2_backupdir=$HOME/pgxc/backup_war2",
    "#=============<< End of future extension demonistration >> "
    "========================================================",
    NULL};
